--[[
描述 ： 本地 文件 
作者 ： 付大志
修改 ： xxs - android
时间 ： 14/12/01
]]

require('MLink.Class');
require('MLink.MLPlugin');
require('MLink.MLData');
require('MLink.Json');
require('MLink.common.MLConfig');
require('MLink.common.MLConst');
require('MLink.MLTaskAlarm');
require('MLink.MLTimer');
require('MLink.MLAudio');
require('MLink.MLFile');
require('MLink.MLGraphics'); 
require('MLink.MLView');   
require('MLink.MLImage');  
require('MLink.MLLocation');  
require('MLink.MLSqliteDB'); 
require('MLink.MLSqlQuery'); 
require('MLink.MLHttp'); 
require('MLink.MLNetFile'); 
require('MLink.MLWebView'); 
require('MLink.MLZoomImageView');
require('MLink.MLVideoView');
require('MLink.MLPdfView');
require('MLink.MLWebImageView');
require('MLink.MLViewPager');
require('MLink.MLEditView');
require('MLink.MLScrollView'); 
require('MLink.MLMediaCapture'); 
require('MLink.MLQRCode');  
require('MLink.MLNavigation'); 
require('MLink.MLCryptor');   
require('MLink.MLMsgPush');  
require('MLink.MLApp');
require('MLink.MLBluetooth');
require('MLink.MLSocketTcp');
require('MLink.MLSocketUdp');
require('MLink.listcell.MLListCell');
require('MLink.listcell.MLListCellData');
require('MLink.listcell.MLListCellView')
require('MLink.listcell.MLListCellButton');
require('MLink.listcell.MLListCellButtonData');
require('MLink.listcell.MLListCellButtonView');
require('MLink.listcell.MLListCellImage');
require('MLink.listcell.MLListCellImageData');
require('MLink.listcell.MLListCellImageView');
require('MLink.listcell.MLListCellLab');
require('MLink.listcell.MLListCellLabData');
require('MLink.listcell.MLListCellLabView');
require('MLink.listcell.MLListCellText');
require('MLink.listcell.MLListCellTextData');
require('MLink.listcell.MLListCellTextView')
require('MLink.MLListView');  
require('MLink.viewCtrl.ViewCtrl');  
require('MLink.viewCtrl.NavCtrl'); 
require('MLink.viewCtrl.CtrlSwitch'); 
require('MLink.splitView.MLSplitViewCtrl')
require('MLink.splitView.MLSplitItemView')
require('MLink.SliderMenuView.SliderMenuViewCtrl')
-- 事件表
animations={}
qtEvent={}
setmetatable(qtEvent,{__mode="kv"})   -- 弱引用
setmetatable(animations,{__mode="kv"})   -- 弱引用
local appSystemClass = AppSystem:new();
 
 
function qt_enevt_init(context)  
    MLNative.MLContext = context;
    MLNative.MLInstance =  appSystemClass;
    MLNative.mScreen= MLNative.getScreen();    
end

--[[
描述 ： 系统相关操作静态方法 类
作者 ： 付大志
修改 ： xxs- android
时间 ： 13/08/08
]]
function qt_event_animation(hashCode)
     if animations[hashCode]~= nil then 
     	animations[hashCode]();   
     	animations[hashCode]= nil; 
     end
end

function qt_enevt_push_msg(msg) 
	Application.onPushMsg(msg);	 
end


--old codes
function qt_event_take_photo(path)
	if App.mTakePhotoFun ~= nil then
			App.mTakePhotoFun(path);
	end
end

function qt_event_thead_run()
	if App.mLuaTheadRunFun ~= nil then
		App.mLuaTheadRunFun();
	end
end
function qt_event_thead_run_end()
	if App.mLuaTheadRunEndFun ~= nil then
		App.mLuaTheadRunEndFun();
	end
end
function qt_event_push_msg(str)
	if  App.mPushMsgTab  ~= nil and App.mPushMsgfun ~= nil then
		App.mPushMsgfun(App.mPushMsgTab, str);
	end
end
function qt_event_LocationListenner(lon, lat, address)
	if App.mLocationFun  ~= nil   then
		App.mLocationFun(lon, lat, address);
	end
end
function qt_event_timerPicker(h,m)

	if  App.mTimePickerFun  ~= nil  then
		App.mTimePickerFun(h,m)
	end
end
function qt_event_datePicker(y,m,d)
	if  App.mDatePickerFun  ~= nil then
		App.mDatePickerFun(y,m,d);
	end
end

function qt_event_email(state)
	 if  App.mSendMailFun  ~= nil then
		App.mSendMailFun(state);
	end
end

function qt_event_alarm_task(taskId)
	-- 告诉页面此task任务已经到达
	Application.onTaskAlarm(taskId); 
	-- if App.mLocalMsgView ~= nil and App.onLocalMsg ~= nil then
	-- 	local idStr = tostring(taskId);
	-- 	App.onLocalMsg(App.mLocalMsgView,idStr);
	-- end
end



--------

MLNative = Class(MLPlugin, 'MLNative');
MLNative.MLContext          = nil;   -- 引擎上下文
MLNative.MLInstance         = nil;   --  nativ实例
----
MLNative.resultCode_takePhoto = 1;
MLNative.resultCode_theadRun = 2;
MLNative.resultCode_theadEnd = 3;  
MLNative.resultCode_pushMSsg = 4;
MLNative.resultCode_timePicker =5;
MLNative.resultCode_datePicker = 6;
MLNative.resultCode_email = 7;
MLNative.resultCode_alarmTask=8;

	-- end
----
MLNative.Style_Common       = 1;
MLNative.Style_Bold         = 2;

MLNative.mDeviceHeight      = nil;
MLNative.mDeviceWidth       = nil;
MLNative.mScreen            = nil;
MLNative.mScreenWidth       = nil;
MLNative.mScreenHeight      = nil;

MLNative.mTakePhotoFun      = nil;
MLNative.mTheadRunFun    = nil; 
MLNative.mTheadRunEndFun = nil;
MLNative.mPushMsgfun	       = nil; 
MLNative.mPushMsgTab        = nil; 
MLNative.mTimePickerFun     = nil;
MLNative.mDatePickerFun     = nil;
MLNative.mSendMailFun	   = nil;
MLNative.mLocalMsgView      = nil; 
MLNative.onLocalMsg         = nil;


function MLNative:onCallBack(resultCode,arg)

    if  resultCode == MLNative.resultCode_theadRun then
       if MLNative.mTheadRunFun ~= nil then 
		   MLNative.mTheadRunFun(); 
		  MLNative.mTheadRunFun = nil;
	   end
	 elseif  resultCode == MLNative.resultCode_theadEnd then
	    if MLNative.mTheadRunEndFun ~= nil then 
		   MLNative.mTheadRunEndFun(); 
		   MLNative.mTheadRunEndFun =nil;
	    end
    elseif resultCode == MLNative.resultCode_pushMSsg then
        if  Application.onPushMsg ~= nil then
	        Application.onPushMsg(arg[1]);
	    end	
    elseif resultCode == MLNative.resultCode_timePicker then
    	if  MLNative.mTimePickerFun  ~= nil  then
		    MLNative.mTimePickerFun(arg[1],arg[2])
		    MLNative.mTimePickerFun = nil;
	    end 
    elseif resultCode == MLNative.resultCode_datePicker then
    	if  MLNative.mDatePickerFun  ~= nil then
		    MLNative.mDatePickerFun(arg[1],arg[2],arg[3]);
		    MLNative.mDatePickerFun = nil;
	    end
    elseif resultCode == MLNative.resultCode_email then
        if  MLNative.mSendMailFun  ~= nil then
		    MLNative.mSendMailFun(arg[1]);
		    MLNative.mSendMailFun = nil;
	    end
    elseif resultCode == MLNative.resultCode_alarmTask  then
        if  MLNativelication.onTaskAlarm then
	        MLNativelication.onTaskAlarm(arg[1]); 
        end
    end
end


--[[
功能   ： 得到设备宽高
参数   ： 无
返回   ： number w,h
]]
function MLNative.deviceWH()

	if MLNative.mDeviceWidth == nil then
		MLNative.mDeviceWidth = appSystemClass:appGetWidth();
	end
	if MLNative.mDeviceHeight == nil then
		MLNative.mDeviceHeight = appSystemClass:appGetHeight();
	end
	return MLNative.mDeviceWidth, MLNative.mDeviceHeight;
end
--[[
功能   ： 得到显示区域的宽高
参数   ： 无
返回   ： w,h
注解   ： 去掉系统的title的像素   
]]
function MLNative.screenWH()
	if MLNative.mScreenWidth == nil then
		MLNative.mScreenWidth = appSystemClass:appGetScreenWidth();
	end
	if MLNative.mScreenHeight == nil then
		MLNative.mScreenHeight = appSystemClass:appGetScreenHeight();
	end
	return MLNative.mScreenWidth, MLNative.mScreenHeight;
end
--[[
功能   ： 得到系统根view
参数   ： 无
返回   ： 系统根MLview类型 
]]
function MLNative.getScreen() 
	if  MLNative.mScreen  then return MLNative.mScreen; end
		local w, h = MLNative.screenWH();	
		local rootView =  appSystemClass:appGetRootView();
	    MLNative.mScreen =   MLView.new():initView(w, h); 
		rootView:groupAddChild(MLNative.mScreen.mInstance,-1, 0,0); 
	return  MLNative.mScreen;
end
--[[
功能：     测试文本的宽度
参数：     string str 待测字符串
参数：     number fh  字符串高度
参数：     number fs  字符串样式
返回      number 文本的宽度
注解：    fs 用法: 需要传入 MLNative.Style_Common
]]
function  MLNative.measStringWidth(str, fh, fs)
	fs = fs or MLNative.Style_Common; 
	str = str or '';
    local fs = fs or 1;
    
 
    if fh==nil then print('Warning: MLGraphics:measStringWidth(), agrument 2 is nil'); return end
    if type(fh) ~= 'number'  then print('Warning: MLGraphics:measStringWidth(), argument 2, type is not number!'); return  end 

    if fs==nil then print('Warning: MLGraphics:measStringWidth(), agrument 3 is nil'); return end
    if type(fs) ~= 'number'  then print('Warning: MLGraphics:measStringWidth(), argument 3, type is not number!'); return  end 

	return appSystemClass:appTextWidth( str,  fh or 0,fs,0);
end
--[[
功能：  测试文本的高度
参数：   string str 待测字符串
参数：   number fh  字符串高度
参数：   number fs  字符串样式
参数：   number lw   lw  限制宽度
返回：   number 文本的高度
注解：   fs 用法: 需要传入 MLNative.Style_Common
]]
function MLNative.measStringHeight(str, fh, fs,lw)  
	fs = fs  or 0;
	lw = lw or 9999
	str = str or '';
	fh = fh or 0;
   
    if fh==nil then print('Warning: MLGraphics:measStringHeight(), agrument 2 is nil'); return end
    if type(fh) ~= 'number'  then print('Warning: MLGraphics:measStringHeight(), argument 2, type is not number!'); return  end 

    if fs==nil then print('Warning: MLGraphics:measStringHeight(), agrument 3 is nil'); return end
    if type(fs) ~= 'number'  then print('Warning: MLGraphics:measStringHeight(), argument 3, type is not number!'); return  end 

    if lw==nil then print('Warning: MLGraphics:measStringHeight(), agrument 4 is nil'); return end
    if type(lw) ~= 'number'  then print('Warning: MLGraphics:measStringHeight(), argument 4, type is not number!'); return  end 

	local  height =  appSystemClass:appTextHeight( str,  fh,  fs,  lw);
    return height;
end

--[[
功能   ： 打电话
参数：  string  phoneNum    电话号码
参数：  boolean  useMainCard 是否用主卡.默认主卡
返回   ： 无
]]
function  MLNative.phoneCall(phoneNum, useMainCard) 

if not phoneNum  then  print('Warning: MLNative.phoneCall(),argument 1 is nil! ') return end
    if type(phoneNum) ~= 'string'  then print('Warning:  MLNative.phoneCall(),argument 1,type is not string!') return end

	appSystemClass:appCall(phoneNum);
end
--[[
功能   ： 发短信
参数：  string phoneNum    电话号码
参数：  string  msg
参数：   boolean useMainCard 是否用主卡.默认主卡
返回   ： 无
]]
function  MLNative.sendSMS(phoneNum, msg, useMainCard)
    if not phoneNum  then  print('Warning: MLNative.sendSMS(),argument 1 is nil! ') return end
    if type(phoneNum) ~= 'string'  then print('Warning:  MLNative.sendSMS(),argument 1,type is not string!') return end

    if not msg  then  print('Warning: MLNative.sendSMS(),argument 2 is nil! ') return end
    if type(msg) ~= 'string'  then print('Warning:  MLNative.sendSMS(),argument 2,type is not string!') return end
    
	appSystemClass:appSendSMS(phoneNum, msg); 
end
--[[
功能   ： 得到 sd卡路径
参数   ： 无
返回   ： sd卡路径
]]
function MLNative.getSDPath() 
	return 'SDCard/';
end
--[[
功能   ： 得到 应用预置数据路径
参数   ： 无
返回   ： 预置数据路径
]]
function MLNative.getMLNativeDataPath() 
	return 'res/data/';
end

--[[
功能   ： 得到 应用预置数据路径
参数   ： 无
返回   ： 预置数据路径
]]
function MLNative.getAppDataPath() 
	return 'res/data/';
end
--[[
功能：     发送邮件   
参数：   table recipents   收件人
参数：   table cc  抄送人地址
参数：   table bcc 密送人
参数：   string subject 主题
参数：   string messageBody 正文
参数：   table attachment  附件的全路径
参数：   function onSendMail  发送状态
注解:    table recipents 字符串数组 {'1122@163.com','1122@163.com'}
注解:    table cc 字符串数组 {'1122@163.com','1122@163.com'}
注解:    table bcc 字符串数组 {'1122@163.com','1122@163.com'}
注解:    Function onSendMail(bool state) state 如true ： 成功 false ： 失败  
注解:    需要真机测试
返回: 无
]]
function MLNative.sendMail(recipents,cc,bcc,subject,messageBody,attachment,onSendMail) 
  	 --"[[\"send1@aa.com\",\"send2@bb.com\"],[\"copy@aa.com\",\"copy2@bb.com\"],[\"SecretTo@aa.com\",\"SecretTo2@bb.com\"],\"主题\",[\"\"],\"发送内容\"]";
	 MLNative.mSendMailFun=onSendMail;
	 if recipents==nil then
	 	recipents={""};
	 end
	 if cc==nil then
	 	cc={""};
	 end
	 if bcc==nil then
	 	bcc={""};
	 end
	 if attachment==nil then
	 	 attachment={""};
	 end 
	-- local jsonObj ='['..recipents..','..cc..','..bcc..',\"'..subject..'\",'..attachment..',\"'..messageBody..'\"]';
	local jsonObj = {recipents, cc, bcc, subject, attachment, messageBody};

	--MLNative.MLInstance:sendMail(MLNative.json(jsonObj),MLNative.MLContext);--底层未实现
end

--[[
功能   ： 得到sd剩余空间
参数   ： 无
返回   ： 无
]]
function MLNative.getSDFreeSpace() 
	return 10000;
end
--[[
功能   ： 得到设备信息
参数   ： 无
返回   ： 设备信息表
]]
function MLNative.deviceInfo()
	local hm = {DeviceID="123456",OS="simulator",isPad=0};
	return MLNative.json(hm)
end

--[[
功能   ： 震动
参数   ： 无
返回   ： 无
]]
function MLNative.vibrate() 
	print("震动");
end
 
function MLNative.json(data) 
	if  type(data) == 'table' then
		local ok, str = pcall(json.encode, data, format and 0);
		if ok then return str; end
		-- if type(data) ~= 'table' then return tostring(data); end
		-- return MLNative_call_MLNative(_MLNative, XConst.EJson, true, data);
	elseif type(data) == 'string' then
		local ok, tab = pcall(json.decode, data);
		if ok then return tab; end
		--return MLNative_call_MLNative(_MLNative, XConst.EJson, false, data);
	else
		pcall(json.decode)
		return nil;
	end
end
--[[
功能   ： 解压文件
参数   ： zipPath	需要解压文件 targetPath	解压目标文件
返回   ： 无
]]
function MLNative.unzip(zipPath, targetPath) 
	appSystemClass:appUnZipFolder(zipPath, targetPath);
end
--[[
功能   ： 生成动画
参数   ： number ms   动画时间单位（秒）
返回   ： 无
]]
function MLNative.genAnimate(fn,ms)  -- GenAnimate (tab, ms)
 	ms =  ms or 200; 
  	local hashCode  = appSystemClass:appGenAnimate(ms);
  	animations[hashCode] = fn; 
end
--[[
功能   ： 执行动画
参数   ： 无
返回   ： 无
]]
function MLNative.doAnimate() 
    appSystemClass:appDoAnimate();  
end

--[[
功能   ： 得到系统时间
参数   ： 无
返回   ： year, month, monthDay, hour, minute, second,weekday;
注释     ：  weekday 范围1-7 周一到周天
]]
function MLNative.getSystemTime() 
	local time = appSystemClass:appGetSystemTime();
	local timetab =  MLNative.json(time);
	return timetab.year, timetab.month, timetab.monthDay, timetab.hour, timetab.minute, timetab.second,timetab.weekday;
end
--[[
功能   ： 得到系统时基
参数   ： 无
返回   ： 毫秒
]]
function MLNative.getSystemTimeBase()
	--return MLNative.MLInstance:getSystemTimeBase();--jwg 未实现
end
--[[
功能   ： 指定时间 到 当前时间间隔
参数   ： year,month,monthDay,hour	minute
返回   ： 多少秒
]]
function MLNative.getTimeIntervalFromNow(y,m,d,h,f)
	y=y or 0;
	m=m or 0;
	d=d or 0;
	h=h or 0;
	f=f or 0;

if not year  then  print('Warning: MLNative.getTimeIntervalFromNow(),argument 1 is nil! ') return end
    if type(year) ~= 'number'  then print('Warning:  MLNative.getTimeIntervalFromNow(),argument 1,type is not number!') return end

    if not month  then  print('Warning: MLNative.getTimeIntervalFromNow(),argument 2 is nil! ') return end
    if type(month) ~= 'number'  then print('Warning:  MLNative.getTimeIntervalFromNow(),argument 2,type is not number!') return end

    if not monthDay  then  print('Warning: MLNative.getTimeIntervalFromNow(),argument 3 is nil! ') return end
    if type(monthDay) ~= 'number'  then print('Warning:  MLNative.getTimeIntervalFromNow(),argument 3,type is not number!') return end

    if not hour  then  print('Warning: MLNative.getTimeIntervalFromNow(),argument 4 is nil! ') return end
    if type(hour) ~= 'number'  then print('Warning:  MLNative.getTimeIntervalFromNow(),argument 4,type is not number!') return end

    if not minute  then  print('Warning: MLNative.getTimeIntervalFromNow(),argument 5 is nil! ') return end
    if type(minute) ~= 'number'  then print('Warning:  MLNative.getTimeIntervalFromNow(),argument 5,type is not number!') return end

	return appSystemClass:appDateIntervalFromNowSecond(y,m,d,h,f);
end
--[[
功能   ： 指定时间和当前时间间隔
参数   ： (number )year,month,monthDay  
返回   ： 多少天
]]
function MLNative.getDateIntervalFromNow(y,m,d)
	y=y or 0;
	m=m or 0;
	d=d or 0;
	return appSystemClass:appDateIntervalFromNow(y,m,d);
end

--[[
功能   ： 时间选择框
参数   ： onTimePicker	选择后通知函数	
返回   ： 无
--0: 完整时间 1:（年月日）  2 小时与分Hour Min am/pm
]]
function MLNative.timePicker(onTimePicker)
	MLNative.mTimePickerFun = onTimePicker;
	appSystemClass:appTimerPicker();
end
--[[
功能   ： 日期选择框
参数   ： onDatePicker	选择后通知函数	
返回   ： 无
]]
function MLNative.datePicker(onDatePicker)
	MLNative.mDatePickerFun = onDatePicker;
	appSystemClass:appDatePicker();
end

--[[
功能   ： 加载lua文件
参数   ： string  name 文件全路径名  （require只需要指定模块名字（不需要加入.lua .dll这样后缀），而dofile需要指定文件的完整路径。 ）
例子   ：MLNative.dofile('/Scripts/MLink/MLMD5.lua')  
返回   ： 无
]]
function MLNative.dofile(name) 
	appSystemClass:appDoFile(name);
end

--[[
功能   ： 启动线程
参数   ： onTheadRun	线程运行通知函	onTheadRunEnd	线程运行结束通知函数
返回   ： 无
]]
function MLNative.thread(onTheadRun,onTheadRunEnd) 
	--[[MLNative.mTheadRunFun = onTheadRun; 
	MLNative.mTheadRunEndFun = onTheadRunEnd; 
	MLNative.MLInstance:thread(MLNative.MLContext);]]--未实现
end



--[[
功能   ： 检测身份证有效性
参数   ： string id   身份证号    
返回   ： boolean true or false
]]
function MLNative.checkIdValid(id)

 if not id  then  print('Warning: MLNative.checkIdValid(),argument 1 is nil! ') return end
    if type(id) ~= 'string'  then print('Warning:  MLNative.checkIdValid(),argument 1,type is not string!') return end

    if #id < 15 then print('Warning: MLNative.checkIdValid(),argument 1, length  is less than 15! ') return end 

    --return  MLNative.MLInstance:appVerify(id); 
end


--[[
功能   ： 得到 身份证信息
参数   ： id   身份证号    
返回   ： year month day sex(0男 1女)
]]
function MLNative.getIdInfo(id) 
--[[if not id  then  print('Warning: MLNative.getIdInfo(),argument 1 is nil! ') return end
    if type(id) ~= 'string'  then print('Warning:  MLNative.getIdInfo(),argument 1,type is not string!') return end

    if #id < 15 then print('Warning: MLNative.getIdInfo(),argument 1, length  is less than 15! ') return end 

 
    local b = MLNative.MLInstance:appVerify(id)
   if b then
		sexNum = string.sub(id,-2,-2) % 2; --0女1男
		local date = string.sub(id,7,-5); 
		if #date == 8 then
			local  year=string.sub(date,1,-5);
			local  month =string.sub(date,5, -3);
			local  day   = string.sub(date,7); 
			local sex;
			if(sexNum == 1) then  
				sex=0;--'男';
			else 
				sex=1;--'女';
			end
			return year,month,day,sex;
		end  
	end ]]

end


--[[
功能   ： 得到 汉字的拼音
参数   ： str	汉字
返回   ： 无
]]
function MLNative.getPingYin(str)
 --[[ if not str  then  print('Warning: MLNative.getPingYin(),argument 1 is nil! ') return end
    if type(str) ~= 'string'  then print('Warning:  MLNative.getPingYin(),argument 1,type is not string!') return end

    local strValue = MLNative.MLInstance:getPingYin(str);
    return strValue;]]
end

--[[
功能   ： 获取联系人列表
参数   ： 无
返回   ： 联系人数据
注解   ： (string)数据格式：[{'name':'aa','phone':[]},{'name':'aa','phone':['1381726789','12738478']}]
]]
function MLNative.getContacts()	
	--[[local people=MLNative.MLInstance:getContacts(MLNative.MLContext);
	print(people);
 	return people;]]
end 

--[[
功能   ： 隐藏键盘
参数   ： 无
返回   ： 无
]]
function MLNative.hidenKeyboard()
	--MLNative.MLInstance:hidenKeyBoard();
end 


 
